package net.dlvx.vlex.wx.config;


import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import java.util.Locale;

@Configuration
public class TablePrefixNamingStrategy implements PhysicalNamingStrategy {

    @Value("${table_prefix}")
    private String prefix;

    @Override
    public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return identifier;
    }

    @Override
    public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return identifier;
    }

    @Override
    public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return Identifier.toIdentifier(prefix + identifier.getText());
    }

    @Override
    public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return identifier;
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
        return identifier;
    }



//    @Override
////    public Identifier toPhysicalCatalogName(Identifier name,
////                                            JdbcEnvironment jdbcEnvironment) {
////        return apply(name, jdbcEnvironment);
////    }
////
////    @Override
////    public Identifier toPhysicalSchemaName(Identifier name,
////                                           JdbcEnvironment jdbcEnvironment) {
////        return apply(name, jdbcEnvironment);
////    }
////
////    @Override
////    public Identifier toPhysicalTableName(Identifier name,
////                                          JdbcEnvironment jdbcEnvironment) {
////        Identifier identifier = apply(name, jdbcEnvironment);
////        String tbName = prefix + identifier.toString();
////        return new Identifier(tbName, identifier.isQuoted());
////    }
////
////    @Override
////    public Identifier toPhysicalSequenceName(Identifier name,
////                                             JdbcEnvironment jdbcEnvironment) {
////        return apply(name, jdbcEnvironment);
////    }
////
////    @Override
////    public Identifier toPhysicalColumnName(Identifier name,
////                                           JdbcEnvironment jdbcEnvironment) {
////        return apply(name, jdbcEnvironment);
////    }
////
////    private Identifier apply(Identifier name, JdbcEnvironment jdbcEnvironment) {
////        if (name == null) {
////            return null;
////        }
////
////        StringBuilder builder = new StringBuilder(name.getText().replace('.', '_'));
////        for (int i = 1; i < builder.length() - 1; i++) {
////            if (isUnderscoreRequired(builder.charAt(i - 1), builder.charAt(i),
////                    builder.charAt(i + 1))) {
////                builder.insert(i++, '_');
////            }
////        }
////        return getIdentifier(builder.toString(), name.isQuoted(), jdbcEnvironment);
////    }
////
////    /**
////     * Get an identifier for the specified details. By default this method will return an
////     * identifier with the name adapted based on the result of
////     * {@link #isCaseInsensitive(JdbcEnvironment)}
////     *
////     * @param name            the name of the identifier
////     * @param quoted          if the identifier is quoted
////     * @param jdbcEnvironment the JDBC environment
////     * @return an identifier instance
////     */
////    protected Identifier getIdentifier(String name, boolean quoted,
////                                       JdbcEnvironment jdbcEnvironment) {
////        if (isCaseInsensitive(jdbcEnvironment)) {
////            name = name.toLowerCase(Locale.ROOT);
////        }
////        return new Identifier(name, quoted);
////    }
////
////    /**
////     * Specify whether the database is case sensitive.
////     *
////     * @param jdbcEnvironment the JDBC environment which can be used to determine case
////     * @return true if the database is case insensitive sensitivity
////     */
////    protected boolean isCaseInsensitive(JdbcEnvironment jdbcEnvironment) {
////        return true;
////    }
////
////    private boolean isUnderscoreRequired(char before, char current, char after) {
////        return Character.isLowerCase(before) && Character.isUpperCase(current)
////                && Character.isLowerCase(after);
////    }
}